package com.niit.base

object Base_09 {

  def main(args: Array[String]): Unit = {
    /*
    过滤：filter   过滤出符合一定条件的数据
     */
    //1 to 9 生成是数组 toList 转换成列表
    var list1 = (1 to 9).toList //(1,2,3,4,5,6,7,8,9)
    //将list1过滤出能够被2整除的数据 _:表示列表中每一个元素
    var ls1 =list1.filter( _ % 2 ==0) //返回一个新的列表
    println(ls1)

    /*
     排序：
      sorted:对集合元素进行默认排序
      sortBy:对集合按照指定字段排序
      sortWith:对集合进行自定义排序
     */
    //sorted:对集合元素进行默认排序
    var list2 = List(3,1,2,4,5,6,9,8,7)
    val ls2 = list2.sorted; //将排序后的数据返回一个新的列表
    println(ls2.reverse)
    //sortBy:对集合按照指定字段排序
    var list3 = List("01 hadoop","02 flume","03 java","04 kafka")
    //按照字母顺序进行排序 x: 01 hadoop  => [01,hadoop] (1) => hadoop  获得了单词，想对单词进行排序 那就按照字母排序
    var ls4 = list3.sortBy(x => x.split(" ")(1))
    println(ls4)
    //究极版
    var ls5 = list3.sortBy(_.split(" ")(1))
    println(ls5)
    //sortWith:对集合进行自定义排序
    var list5 = List(2,3,1,4,5)
    //将list5按照降序进行排序
    var ls6 = list5.sortWith((x,y) => x > y )
    println(ls6)
    //究极版  //此时x和y都是表示列表中的每一个元素，并且x和y也是在固定位置。那么这样大家就习惯性找个东西做替代 第一个_表示x 第二个_表示y
    var ls7 = list5.sortWith( _ > _ )

    /*
    分组：将数组按照指定条件进行分组 groupBy
    需求： 1.将一个班的学生按照性别进行分组
          2.统计不同性别人数
     */
    var list6 = List("张三"->"男","李四"->"女","王五"->"男")
    //按照性别进行分组
    var ls8 =  list6.groupBy(x => x._2)
    println(ls8)
    ls8 =  list6.groupBy(_._2)
    println(ls8)
    //统计不同性别人数  x:男 -> List((张三,男), (王五,男))  女 -> List((李四,女))
    var ls9 =  ls8.map(x=> x._1 -> x._2.size) //x不能写成_ 因为后面出现了两次
    println(ls9)

    /*
     聚合操作：将一个列表中的数据合并为一个
        reduce:用来对集合元素进行聚合计算
        fold：用来对集合元素进行折叠计算
     */
    /*

      reduce = reduceLift :将集合从左向右进行计算
      reduceRight：将集合从右向左进行计算
     */
    var list7 = (1 to 10).toList
    var res =  list7.reduce((x,y)=> x + y)
    res =  list7.reduce( _ + _ )
    println(res)
    res =  list7.reduceLeft( _ + _ )
    println(res)
    res =  list7.reduceRight( _ + _ )
    println(res)

    /*
    fold 折叠：和reduce一样，但是多了一个初始值参数
     fold和foldLeft一样，都是从左向右进行计算
     foldRight 从右向左进行计算
     */
    //需求：定义一个列表1-10，假设初始值为100，使用fold方法计算所有元素的和
    var list8 = (1 to 10).toList
    res = list8.fold(100)(_ + _)  // 100 +1+2+3+4+5+6+7+8+9+10
    res = list8.foldLeft(100)(_ + _)
    res = list8.foldRight(100)(_ + _)
    println(res) //155

  }

}
